<!DOCTYPE html>


<html lang="en">
  

    <head>
      <meta charset="utf-8" />
        
      <meta name="description" content="時光的个人博客" />
      
      <meta
        name="viewport"
        content="width=device-width, initial-scale=1, maximum-scale=1"
      />
	  <meta name="referrer" content="no-referrer" />

      <title>SVN 安装配置 |  時光</title>
  <meta name="generator" content="hexo-theme-ayer">
      
      <link rel="shortcut icon" href="/favicon.ico" />
       
<link rel="stylesheet" href="/dist/main.css">

      
<link rel="stylesheet" href="/css/fonts/remixicon.css">

      
<link rel="stylesheet" href="/css/custom.css">
 
      <script src="https://cdn.staticfile.org/pace/1.2.4/pace.min.js"></script>
       
 

      <link
        rel="stylesheet"
        href="https://cdn.jsdelivr.net/npm/@sweetalert2/theme-bulma@5.0.1/bulma.min.css"
      />
      <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11.0.19/dist/sweetalert2.min.js"></script>

      <!-- mermaid -->
      
      <style>
        .swal2-styled.swal2-confirm {
          font-size: 1.6rem;
        }
      </style>
    <link rel="alternate" href="/atom.xml" title="時光" type="application/atom+xml">
</head>
  </html>
</html>


<body>
  <div id="app">
    
      
    <main class="content on">
      <section class="outer">
  <article
  id="post-SVN 安装配置"
  class="article article-type-post"
  itemscope
  itemprop="blogPost"
  data-scroll-reveal
>
  <div class="article-inner">
    
    <header class="article-header">
       
<h1 class="article-title sea-center" style="border-left:0" itemprop="name">
  SVN 安装配置
</h1>
 

      
    </header>
     
    <div class="article-meta">
      <a href="/2023/03/19/SVN%20%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE/" class="article-date">
  <time datetime="2023-03-19T07:04:00.000Z" itemprop="datePublished">2023-03-19</time>
</a> 
  <div class="article-category">
    <a class="article-category-link" href="/categories/%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B/">安装教程</a>
  </div>
  
<div class="word_count">
    <span class="post-time">
        <span class="post-meta-item-icon">
            <i class="ri-quill-pen-line"></i>
            <span class="post-meta-item-text"> Word count:</span>
            <span class="post-count">953</span>
        </span>
    </span>

    <span class="post-time">
        &nbsp; | &nbsp;
        <span class="post-meta-item-icon">
            <i class="ri-book-open-line"></i>
            <span class="post-meta-item-text"> Reading time≈</span>
            <span class="post-count">3 min</span>
        </span>
    </span>
</div>
 
    </div>
      
    <div class="tocbot"></div>




  
    <div class="article-entry" itemprop="articleBody">
       
  <h1 id="SVN-安装配置"><a href="#SVN-安装配置" class="headerlink" title="SVN 安装配置"></a>SVN 安装配置</h1><p>SVN的安装分为2部分，第一部分是服务端安装，第二部分的客户端安装。</p>
<p>一般情况下，只需要安装客户端即可，因为在企业中服务端是由运维来维护的，我们只需要开通一个账号即可。</p>
<p>常用的客户端又分为两种：安装在操作系统中的客户端、Eclipse的插件</p>
<h2 id="一、服务端安装"><a href="#一、服务端安装" class="headerlink" title="一、服务端安装"></a>一、服务端安装</h2><p>官网下载服务端 <a target="_blank" rel="noopener" href="https://www.visualsvn.com/server/download/">visualsvn</a> </p>
<p>也可直接通过链接 <a target="_blank" rel="noopener" href="https://www.visualsvn.com/files/VisualSVN-Server-5.1.1-x64.msi">https://www.visualsvn.com/files/VisualSVN-Server-5.1.1-x64.msi</a> 下载</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/5be4c48fafc14347b3080c26eef226ae" alt="image-20230205084005275"></p>
<p>下载的程序如下所示,双击运行安装</p>
<p>无脑下一步</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/849c918120754c209d525dfccf7c0d87" alt="image-20230205084238027"></p>
<p>接受协议，无脑下一步</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/db3126d897dc4979ad4cfafb77552635" alt="image-20230205084454087"></p>
<p>保留默认设置（选择visualVSN服务器和管理控制台），并添加到系统环境变量</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/e048000469c24fe4a6695c431aed1538" alt="image-20230205084619412"></p>
<p>安装配置</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/f3c550e2d18f4e11a0431c0485fa8035" alt="image-20230205090521727"></p>
<p>若端口被占用，可调整为其他端口，例如 8843</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/008b1bb25f6d4545a05af0c372b58c4d" alt="image-20230205090726009"></p>
<p>可使用cmd命令 <code>netstat -oan</code> 查看被占用端口的程序，可以看到 443端口被 pid 为 4460的进程占用</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/e1e076f126ec483cb2a8e1d7048ab0fb" alt="image-20230205085746068"></p>
<p>使用 <code>tasklist /FI &quot;PID eq xx&quot;</code> 查看详细进程信息   xx为要查看的pid</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/26b0d8aab4d341089685cc8f9755f567" alt="image-20230205090241358"></p>
<p>相关参考</p>
<blockquote>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/Jw_1201/article/details/124846832">https://blog.csdn.net/Jw_1201/article/details/124846832</a></p>
<p><a target="_blank" rel="noopener" href="https://www.cnblogs.com/cyyljw/p/6918037.html">https://www.cnblogs.com/cyyljw/p/6918037.html</a></p>
</blockquote>
<p>继续无脑下一步</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/183b86f95ea344c2ae5519d0e4484167" alt="image-20230205091241962"></p>
<p>选择服务器对用户进行身份验证的方式</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/6d741af93849447b8fdeca9f7b6e6ff3" alt="image-20230205091638977"></p>
<p>至此，安装向导已完成，点击Install 安装即可</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/819ca28261584700a062d67eb11f3133" alt="image-20230205091803713"></p>
<p>安装好后点击 Finish 即可</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/081a7288266a4bdc9c572e86c66c7c42" alt="image-20230205091940283"></p>
<h2 id="二、客户端安装"><a href="#二、客户端安装" class="headerlink" title="二、客户端安装"></a>二、客户端安装</h2><p>官网下载客户端 <a target="_blank" rel="noopener" href="https://www.visualsvn.com/visualsvn/download/">visualsvn</a></p>
<p>也可通过链接  <a target="_blank" rel="noopener" href="https://www.visualsvn.com/files/TortoiseSVN-1.14.5.29465-x64-svn-1.14.2.msi">https://www.visualsvn.com/files/TortoiseSVN-1.14.5.29465-x64-svn-1.14.2.msi</a>  进行下载</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/dfc095b375214f74bf4686cda5532d41" alt="image-20230205093835931"></p>
<p>双击运行</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/718cd37ec6ba40d684db67af9c1d6563" alt="image-20230205094043724"></p>
<p>无脑下一步</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/a3782abf91054b3a9b413edfe7b08932" alt="image-20230205094113919"></p>
<p>继续无脑下一步</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/a307588cf1eb47ccb38a2725b2c41b00" alt="image-20230205094441591"></p>
<p>一路无脑下一步</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/d2470a8c3bd14776b5aae8d9030bf103" alt="image-20230205094532646"></p>
<p>点击 Install 安装即可</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/da473b10603948bc806da597a8121a99" alt="image-20230205094610279"></p>
<h2 id="三、SVN-服务配置与使用"><a href="#三、SVN-服务配置与使用" class="headerlink" title="三、SVN 服务配置与使用"></a>三、SVN 服务配置与使用</h2><p>启动 VisualSVN Server Manager</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/9f8e01bbc2754291a83383e623ff87c4" alt="image-20230205094913369"></p>
<p>在 Repositories 上右键 &gt; 新建 &gt; Repository</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/0aaddd20c253446086c506f942402424" alt="image-20230205095205241"></p>
<p>选择常规FSFS存储库,默认保持不动，无脑下一步</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/787e4dac867e45a8a08df82a6a4dc04b" alt="image-20230205095305736"></p>
<p>输入仓库名称</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/b6c48b3051384872a4b088ac1368617f" alt="image-20230205095447097"></p>
<p>可根据需要选择</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/f9253ecf18d74ae297b854f3c9237e85" alt="image-20230205095816648"></p>
<p><img src="https://s1.vika.cn/space/2023/03/20/99791d3777b949de805c291d458756c1" alt="image-20230205100045808"></p>
<p>创建新存储库，点击Create进行创建</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/64a5b4c45956465ebd611951dc56c5a8" alt="image-20230205100146911"></p>
<p>创建完成后会提示仓库地址</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/43ea1230a26a41998edf9395baf029ab" alt="image-20230205100327545"></p>
<p>在服务端也能看到新创建的仓库</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/6614346059ab489e8af5d79d5b706c70" alt="image-20230205100444275"></p>
<p>在Users 上右键添加用户</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/aee65899f43840258e414cf40ba66cd7" alt="image-20230205100543811"></p>
<p>设置用户名密码</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/bc2fcaacaa2744e59d8a7454054b4760" alt="image-20230205100707354"></p>
<p>若密码不符合复杂度要求，点击继续此设置</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/f00896991a53410d86cde5f2a933e1c4" alt="image-20230205100805631"></p>
<p>新用户创建成功</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/83252e9688cf405abb03588547184bdc" alt="image-20230205100846952"></p>
<p>在 Groups 上 创建组 或者新建 &gt; Group</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/dad029427e344dc8ae5268a03f8f6ac7" alt="image-20230205101106818"></p>
<p>设置组名称，选择该组下的成员</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/8fe9b46a15064af2a641c85e0af0898c" alt="image-20230205101234420"></p>
<p>创建好后如下所示</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/37cea76989d24ada914ac345c191a637" alt="image-20230205101405882"></p>
<p>设置权限</p>
<p>在仓库上右键 &gt; Properties</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/8c3dee950925470c80ea8c82a9f8e33d" alt="image-20230205101540976"></p>
<p>可以选择赋予用户不同的权限</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/24c61d4661f94a66906b4a7177579e61" alt="image-20230205101837575"></p>
<p>从远程拉取代码并上传本地文件</p>
<p>创建一个测试目录</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/83abb49ae4964ab3b4ec9fa9fdb05ed1" alt="image-20230205102045196"></p>
<p>复制参考地址</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/808e490442c54f5aa24a9e611ca79108" alt="image-20230205102247506"></p>
<p>在任意目录右键，SVN Checkout 拉取仓库代码</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/8b87744e8f7f4004aa8eebfdb793fdcb" alt="image-20230205102352511"></p>
<p>输入仓库地址和本地保存目录</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/5c9f8f9a96954a68861a6f4d7ec97f83" alt="image-20230205102535027"></p>
<p>输入有权限访问的账号密码</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/da1089d929f44d139efd1e559fb96b05" alt="image-20230205102631117"></p>
<p>代码拉取成功后本地会生成指定目录，由于我的目前时空仓库，只有一个 .svn 的隐藏目录</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/9549957d344946c6a967d9956e3b0b5d" alt="image-20230205102811583"></p>
<p>在该目录创建两个文件，模拟要上传的本地文件</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/c5a53fb27f7a4c33965d314c4cb1d9c5" alt="image-20230205103018496"></p>
<p>在该目录右键 &gt; SVN Commit 提交文件</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/39f2b32262904129a88ba9882d6e31eb" alt="image-20230205103120010"></p>
<p>本地创建了两个文件，先只提交一个进行测试</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/039b9c7791cd4af28c7a0fefa3dbd248" alt="image-20230205103413241"></p>
<p>提交成功</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/0b887e14053248929e8f6a713436574a" alt="image-20230205103500891"></p>
<p>刷新一下仓库，可以看到文件上传成功</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/ff62bcc0ba6f457e8b0f13dbd2a9a60b" alt="image-20230205103550836"></p>
<p>也可以在浏览器查看</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/b179a171024344b89ef1835415c3841d" alt="image-20230205103655248"></p>
<p>输入账号密码进行访问，可以看到刚才上传的文件</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/720e90062df04fa9b9f9d57e837e0c49" alt="image-20230205103752122"></p>
<p>往远程仓库导入本地目录及文件</p>
<p>在本地创建目录及文件 </p>
<p>此处我创建了个 test2目录，test2中包含 test2.1目录和 test2.txt ,test2.1目录中包含 test2.1.1.txt和test2.1.2.txt</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/83da1267f48f49dba7d03dbd901aaa10" alt="image-20230205104619766"></p>
<p>在 test2 目录内右键 &gt; TortoiseSVN &gt; Import </p>
<p><img src="https://s1.vika.cn/space/2023/03/20/af0f7888c88048d59140aa7f74a59328" alt="image-20230205104832893"></p>
<p>注意导入的仓库地址要在远程目录的后面加上本地目录名称，这样才能保持远程目录与本地目录层次结构一致</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/0fa80a43d1924c9b8d84440c93c5a11a" alt="image-20230205105022669"></p>
<p>导入成功</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/252993340f3d471d8be3911970a701ab" alt="image-20230205105211304"></p>
<p>刷线一下仓库</p>
<p><img src="https://s1.vika.cn/space/2023/03/20/16d7c644e4974d4fa62f058a5dfb3c2c" alt="image-20230205105310142"></p>
<p>参考</p>
<blockquote>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/Ruishine/article/details/121467191">https://blog.csdn.net/Ruishine/article/details/121467191</a></p>
</blockquote>
 
      <!-- reward -->
      
      <div id="reword-out">
        <div id="reward-btn">
          Donate
        </div>
      </div>
      
    </div>
    

    <!-- copyright -->
    
    <div class="declare">
      <ul class="post-copyright">
        <li>
          <i class="ri-copyright-line"></i>
          <strong>Copyright： </strong>
          
          Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
          
        </li>
      </ul>
    </div>
    
    <footer class="article-footer">
       
<div class="share-btn">
      <span class="share-sns share-outer">
        <i class="ri-share-forward-line"></i>
        分享
      </span>
      <div class="share-wrap">
        <i class="arrow"></i>
        <div class="share-icons">
          
          <a class="weibo share-sns" href="javascript:;" data-type="weibo">
            <i class="ri-weibo-fill"></i>
          </a>
          <a class="weixin share-sns wxFab" href="javascript:;" data-type="weixin">
            <i class="ri-wechat-fill"></i>
          </a>
          <a class="qq share-sns" href="javascript:;" data-type="qq">
            <i class="ri-qq-fill"></i>
          </a>
          <a class="douban share-sns" href="javascript:;" data-type="douban">
            <i class="ri-douban-line"></i>
          </a>
          <!-- <a class="qzone share-sns" href="javascript:;" data-type="qzone">
            <i class="icon icon-qzone"></i>
          </a> -->
          
          <a class="facebook share-sns" href="javascript:;" data-type="facebook">
            <i class="ri-facebook-circle-fill"></i>
          </a>
          <a class="twitter share-sns" href="javascript:;" data-type="twitter">
            <i class="ri-twitter-fill"></i>
          </a>
          <a class="google share-sns" href="javascript:;" data-type="google">
            <i class="ri-google-fill"></i>
          </a>
        </div>
      </div>
</div>

<div class="wx-share-modal">
    <a class="modal-close" href="javascript:;"><i class="ri-close-circle-line"></i></a>
    <p>扫一扫，分享到微信</p>
    <div class="wx-qrcode">
      <img src="//api.qrserver.com/v1/create-qr-code/?size=150x150&data=http://example.com/2023/03/19/SVN%20%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE/" alt="微信分享二维码">
    </div>
</div>

<div id="share-mask"></div>  
  <ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/svn/" rel="tag">svn</a></li></ul>

    </footer>
  </div>

   
  <nav class="article-nav">
    
      <a href="/2023/03/28/java%E6%9B%BF%E6%8D%A2%E7%AC%ACN%E6%AC%A1%E5%87%BA%E7%8E%B0%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2/" class="article-nav-link">
        <strong class="article-nav-caption">上一篇</strong>
        <div class="article-nav-title">
          
            java替换第N次出现的字符串
          
        </div>
      </a>
    
    
      <a href="/2023/03/19/svn%20E230001%20Server%20SSL%20certificate%20verification%20failed%20certificate%20issued%20for%20a%20different%20hostname,%20issuer%20is%20not%20tru/" class="article-nav-link">
        <strong class="article-nav-caption">下一篇</strong>
        <div class="article-nav-title">Server SSL certificate verification failed  certificate issued for a different hostname, issuer is not trusted</div>
      </a>
    
  </nav>

   
<!-- valine评论 -->
<div id="vcomments-box">
  <div id="vcomments"></div>
</div>
<script src="//cdn1.lncld.net/static/js/3.0.4/av-min.js"></script>
<script src="https://cdn.staticfile.org/valine/1.4.16/Valine.min.js"></script>
<script>
  new Valine({
    el: "#vcomments",
    app_id: "dx3B54wOwhi75vxC2IAZagtg-gzGzoHsz",
    app_key: "m4k2fhnFa1iPI4vbofHqMY5X",
    path: window.location.pathname,
    avatar: "monsterid",
    placeholder: "给我的文章加点评论吧~",
    recordIP: true,
  });
  const infoEle = document.querySelector("#vcomments .info");
  if (infoEle && infoEle.childNodes && infoEle.childNodes.length > 0) {
    infoEle.childNodes.forEach(function (item) {
      item.parentNode.removeChild(item);
    });
  }
</script>
<style>
  #vcomments-box {
    padding: 5px 30px;
  }

  @media screen and (max-width: 800px) {
    #vcomments-box {
      padding: 5px 0px;
    }
  }

  #vcomments-box #vcomments {
    background-color: #fff;
  }

  .v .vlist .vcard .vh {
    padding-right: 20px;
  }

  .v .vlist .vcard {
    padding-left: 10px;
  }
</style>

 
   
  
   
    <script src="https://cdn.staticfile.org/twikoo/1.4.18/twikoo.all.min.js"></script>
    <div id="twikoo" class="twikoo"></div>
    <script>
        twikoo.init({
            envId: ""
        })
    </script>
 
</article>

</section>
      <footer class="footer">
  <div class="outer">
    <ul>
      <li>
        Copyrights &copy;
        2023
        <i class="ri-heart-fill heart_icon"></i> Shiguang
      </li>
    </ul>
    <ul>
      <li>
        
      </li>
    </ul>
    <ul>
      <li>
        
        
        <span>
  <span><i class="ri-user-3-fill"></i>Visitors:<span id="busuanzi_value_site_uv"></span></span>
  <span class="division">|</span>
  <span><i class="ri-eye-fill"></i>Views:<span id="busuanzi_value_page_pv"></span></span>
</span>
        
      </li>
    </ul>
    <ul>
      
    </ul>
    <ul>
      
    </ul>
    <ul>
      <li>
        <!-- cnzz统计 -->
        
        <script type="text/javascript" src='https://s9.cnzz.com/z_stat.php?id=1278069914&amp;web_id=1278069914'></script>
        
      </li>
    </ul>
  </div>
</footer>    
    </main>
    <div class="float_btns">
      <div class="totop" id="totop">
  <i class="ri-arrow-up-line"></i>
</div>

<div class="todark" id="todark">
  <i class="ri-moon-line"></i>
</div>

    </div>
    <aside class="sidebar on">
      <button class="navbar-toggle"></button>
<nav class="navbar">
  
  <div class="logo">
    <a href="/"><img src="/images/ayer-side.svg" alt="時光"></a>
  </div>
  
  <ul class="nav nav-main">
    
    <li class="nav-item">
      <a class="nav-item-link" href="/">主页</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/archives">归档</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/categories">分类</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/tags">标签</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/friends">友链</a>
    </li>
    
  </ul>
</nav>
<nav class="navbar navbar-bottom">
  <ul class="nav">
    <li class="nav-item">
      
      <a class="nav-item-link nav-item-search"  title="Search">
        <i class="ri-search-line"></i>
      </a>
      
      
      <a class="nav-item-link" target="_blank" href="/atom.xml" title="RSS Feed">
        <i class="ri-rss-line"></i>
      </a>
      
    </li>
  </ul>
</nav>
<div class="search-form-wrap">
  <div class="local-search local-search-plugin">
  <input type="search" id="local-search-input" class="local-search-input" placeholder="Search...">
  <div id="local-search-result" class="local-search-result"></div>
</div>
</div>
    </aside>
    <div id="mask"></div>

<!-- #reward -->
<div id="reward">
  <span class="close"><i class="ri-close-line"></i></span>
  <p class="reward-p"><i class="ri-cup-line"></i>请我喝杯咖啡吧~</p>
  <div class="reward-box">
    
    <div class="reward-item">
      <img class="reward-img" src="/images/alipay.jpg">
      <span class="reward-type">支付宝</span>
    </div>
    
    
    <div class="reward-item">
      <img class="reward-img" src="/images/wechat.jpg">
      <span class="reward-type">微信</span>
    </div>
    
  </div>
</div>
    
<script src="/js/jquery-3.6.0.min.js"></script>
 
<script src="/js/lazyload.min.js"></script>

<!-- Tocbot -->
 
<script src="/js/tocbot.min.js"></script>

<script>
  tocbot.init({
    tocSelector: ".tocbot",
    contentSelector: ".article-entry",
    headingSelector: "h1, h2, h3, h4, h5, h6",
    hasInnerContainers: true,
    scrollSmooth: true,
    scrollContainer: "main",
    positionFixedSelector: ".tocbot",
    positionFixedClass: "is-position-fixed",
    fixedSidebarOffset: "auto",
  });
</script>

<script src="https://cdn.staticfile.org/jquery-modal/0.9.2/jquery.modal.min.js"></script>
<link
  rel="stylesheet"
  href="https://cdn.staticfile.org/jquery-modal/0.9.2/jquery.modal.min.css"
/>
<script src="https://cdn.staticfile.org/justifiedGallery/3.8.1/js/jquery.justifiedGallery.min.js"></script>

<script src="/dist/main.js"></script>

<!-- ImageViewer -->
 <!-- Root element of PhotoSwipe. Must have class pswp. -->
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">

    <!-- Background of PhotoSwipe. 
         It's a separate element as animating opacity is faster than rgba(). -->
    <div class="pswp__bg"></div>

    <!-- Slides wrapper with overflow:hidden. -->
    <div class="pswp__scroll-wrap">

        <!-- Container that holds slides. 
            PhotoSwipe keeps only 3 of them in the DOM to save memory.
            Don't modify these 3 pswp__item elements, data is added later on. -->
        <div class="pswp__container">
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
        </div>

        <!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
        <div class="pswp__ui pswp__ui--hidden">

            <div class="pswp__top-bar">

                <!--  Controls are self-explanatory. Order can be changed. -->

                <div class="pswp__counter"></div>

                <button class="pswp__button pswp__button--close" title="Close (Esc)"></button>

                <button class="pswp__button pswp__button--share" style="display:none" title="Share"></button>

                <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>

                <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>

                <!-- Preloader demo http://codepen.io/dimsemenov/pen/yyBWoR -->
                <!-- element will get class pswp__preloader--active when preloader is running -->
                <div class="pswp__preloader">
                    <div class="pswp__preloader__icn">
                        <div class="pswp__preloader__cut">
                            <div class="pswp__preloader__donut"></div>
                        </div>
                    </div>
                </div>
            </div>

            <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
                <div class="pswp__share-tooltip"></div>
            </div>

            <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
            </button>

            <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
            </button>

            <div class="pswp__caption">
                <div class="pswp__caption__center"></div>
            </div>

        </div>

    </div>

</div>

<link rel="stylesheet" href="https://cdn.staticfile.org/photoswipe/4.1.3/photoswipe.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/photoswipe/4.1.3/default-skin/default-skin.min.css">
<script src="https://cdn.staticfile.org/photoswipe/4.1.3/photoswipe.min.js"></script>
<script src="https://cdn.staticfile.org/photoswipe/4.1.3/photoswipe-ui-default.min.js"></script>

<script>
    function viewer_init() {
        let pswpElement = document.querySelectorAll('.pswp')[0];
        let $imgArr = document.querySelectorAll(('.article-entry img:not(.reward-img)'))

        $imgArr.forEach(($em, i) => {
            $em.onclick = () => {
                // slider展开状态
                // todo: 这样不好，后面改成状态
                if (document.querySelector('.left-col.show')) return
                let items = []
                $imgArr.forEach(($em2, i2) => {
                    let img = $em2.getAttribute('data-idx', i2)
                    let src = $em2.getAttribute('data-target') || $em2.getAttribute('src')
                    let title = $em2.getAttribute('alt')
                    // 获得原图尺寸
                    const image = new Image()
                    image.src = src
                    items.push({
                        src: src,
                        w: image.width || $em2.width,
                        h: image.height || $em2.height,
                        title: title
                    })
                })
                var gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, {
                    index: parseInt(i)
                });
                gallery.init()
            }
        })
    }
    viewer_init()
</script> 
<!-- MathJax -->

<!-- Katex -->

<!-- busuanzi  -->
 
<script src="/js/busuanzi-2.3.pure.min.js"></script>
 
<!-- ClickLove -->

<!-- ClickBoom1 -->

<!-- ClickBoom2 -->

<!-- CodeCopy -->
 
<link rel="stylesheet" href="/css/clipboard.css">
 <script src="https://cdn.staticfile.org/clipboard.js/2.0.10/clipboard.min.js"></script>
<script>
  function wait(callback, seconds) {
    var timelag = null;
    timelag = window.setTimeout(callback, seconds);
  }
  !function (e, t, a) {
    var initCopyCode = function(){
      var copyHtml = '';
      copyHtml += '<button class="btn-copy" data-clipboard-snippet="">';
      copyHtml += '<i class="ri-file-copy-2-line"></i><span>COPY</span>';
      copyHtml += '</button>';
      $(".highlight .code pre").before(copyHtml);
      $(".article pre code").before(copyHtml);
      var clipboard = new ClipboardJS('.btn-copy', {
        target: function(trigger) {
          return trigger.nextElementSibling;
        }
      });
      clipboard.on('success', function(e) {
        let $btn = $(e.trigger);
        $btn.addClass('copied');
        let $icon = $($btn.find('i'));
        $icon.removeClass('ri-file-copy-2-line');
        $icon.addClass('ri-checkbox-circle-line');
        let $span = $($btn.find('span'));
        $span[0].innerText = 'COPIED';
        
        wait(function () { // 等待两秒钟后恢复
          $icon.removeClass('ri-checkbox-circle-line');
          $icon.addClass('ri-file-copy-2-line');
          $span[0].innerText = 'COPY';
        }, 2000);
      });
      clipboard.on('error', function(e) {
        e.clearSelection();
        let $btn = $(e.trigger);
        $btn.addClass('copy-failed');
        let $icon = $($btn.find('i'));
        $icon.removeClass('ri-file-copy-2-line');
        $icon.addClass('ri-time-line');
        let $span = $($btn.find('span'));
        $span[0].innerText = 'COPY FAILED';
        
        wait(function () { // 等待两秒钟后恢复
          $icon.removeClass('ri-time-line');
          $icon.addClass('ri-file-copy-2-line');
          $span[0].innerText = 'COPY';
        }, 2000);
      });
    }
    initCopyCode();
  }(window, document);
</script>
 
<!-- CanvasBackground -->

<script>
  if (window.mermaid) {
    mermaid.initialize({ theme: "forest" });
  }
</script>


    
    

  </div>
</body>

</html>